package models

import (
	"gorm.io/gorm"
)

// QueryCondition 定义了查询条件
type QueryCondition struct {
	Field    string
	Operator string
	Value    interface{}
}

func GetDbByQueryCondation(db *gorm.DB, conditions []QueryCondition) *gorm.DB {
	// 应用查询条件
	for _, condition := range conditions {
		switch condition.Operator {
		case ">":
			db = db.Where(condition.Field+" > ?", condition.Value)
		case "<":
			db = db.Where(condition.Field+" < ?", condition.Value)
		case ">=":
			db = db.Where(condition.Field+" >= ?", condition.Value)
		case "<=":
			db = db.Where(condition.Field+" <= ?", condition.Value)
		case "=":
			db = db.Where(condition.Field+" = ?", condition.Value)
		case "LIKE":
			db = db.Where(condition.Field+" LIKE ?", "%"+condition.Value.(string)+"%")
		case "IN":
			// 假设IN操作的值是一个切片
			db = db.Where(condition.Field+" IN (?)", condition.Value)
		default:
			// 可以处理默认情况或者返回错误
			db = db.Where(condition.Field+" = ?", condition.Value)
		}
	}
	return db
}

// PageInfo 分页信息结构体
type PageInfo struct {
	Page     int   // 当前页码
	PageSize int   // 每页数量
	Total    int64 // 总记录数
}

// PageResult 定义了分页查询的结果
type PageResult[T any] struct {
	Data     *[]T  `json:"data"`
	Total    int64 `json:"total"`
	Page     int   `json:"page"`
	PageSize int   `json:"page_size"`
}

// Paginate  分页查询通用方法
func Paginate[T any](db *gorm.DB, pageInfo *PageInfo, result *[]T, s string) (PageResult[T], error) {

	// 计算总记录数
	count := int64(0)
	if err := db.Count(&count).Error; err != nil {
		return PageResult[T]{}, err
	}
	pageInfo.Total = count

	// 计算总页数
	totalPages := count / int64(pageInfo.PageSize)
	if count%int64(pageInfo.PageSize) > 0 {
		totalPages++
	}

	// 检查页码是否超出范围
	//if int64(pageInfo.Page) > totalPages {
	//	// 使用 fmt.Errorf 创建一个新的错误
	//	err1 := fmt.Errorf("检查页码是否超出范围")
	//	return PageResult[T]{}, err1 // 或者返回错误，取决于你的需求
	//}

	// 应用分页
	offset := (pageInfo.Page - 1) * pageInfo.PageSize
	db = db.Offset(offset).Limit(pageInfo.PageSize)

	// 执行查询
	if err := db.Select(s).Find(result).Error; err != nil {
		return PageResult[T]{}, err
	}
	r := PageResult[T]{
		Page:     pageInfo.Page,     // 页码
		PageSize: pageInfo.PageSize, // 每页数量
		Total:    count,             // 总记录数
		Data:     result,            // 数据
	}
	return r, nil
}
